/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package snakesandladders;

import PizzaEnvenenada.GUIPizzaEnvenenada;
import Precipicio.GUIPrecipicio;
import javax.swing.JDialog;
import javax.swing.JOptionPane;

/**
 *
 * @author andres
 */
public class AdminJuego
{
    JugadorSAL jugador,maquina;
    int ultimoLanzamiento,penalPerderMini,penalEmpMini;
    Casilla casillas[];
    boolean asignoCasilla;

    public AdminJuego(Casilla casillas[])
    {
        this.casillas=casillas;
        penalEmpMini=3;
        penalPerderMini=6;
        jugador=new JugadorSAL(1);
        maquina=new JugadorSAL(2);
    }


    public boolean verificarFinJuego()
    {
        if(jugador.getNumCasilla()==63)
        {
            JOptionPane.showMessageDialog(null,  "Felicitaciones!! Has ganado el juego.","Fin del Juego", JOptionPane.INFORMATION_MESSAGE);
            return true;
        }

        else if(maquina.getNumCasilla() == 63)
        {
            JOptionPane.showMessageDialog(null,  "Has perdido.","Fin del Juego", JOptionPane.INFORMATION_MESSAGE);
            return true;
        }


        return false;
    }

    public void verificarCulebrasyEscaleras(int numCasilla, JugadorSAL jugadorACorer)
    {

         System.out.println("vieja casilla: "+jugadorACorer.getNumCasilla());
        if(casillas[numCasilla].hayCulebra)
        {
            //jugadorACorer.setNumCasilla(casillas[numCasilla].getColaCulebra());
            ultimoLanzamiento=(casillas[numCasilla].getColaCulebra()-jugadorACorer.getNumCasilla());
            realizarJugada(jugadorACorer.getId());
        }
        else if(casillas[numCasilla].hayEscalera)
        {
            //jugadorACorer.setNumCasilla(casillas[numCasilla].getFinEscalera());
            ultimoLanzamiento=(casillas[numCasilla].getFinEscalera()-jugadorACorer.getNumCasilla());
            realizarJugada(jugadorACorer.getId());
        }
        else
        {
            jugadorACorer.setNumCasilla(numCasilla);
        }

         asignoCasilla=true;
         
         System.out.println("nueva casilla: "+jugadorACorer.getNumCasilla());
    }


    public void realizarJugada(int idJugador)
    {
        int avance=ultimoLanzamiento;
        int nuevaCasilla=0;
        int jugGanoMiniJuego=-1;
        
        if(idJugador==1)
        {            

           nuevaCasilla= verificarNuevaCasilla(jugador.getNumCasilla()+avance);

            if(maquina.getNumCasilla()==nuevaCasilla)
            {
                maquina.setLlegoPrimero(true);
                jugGanoMiniJuego=disputarCasilla(maquina.getId());
                
            }
            else
            {
                    jugador.setLlegoPrimero(true);
                    verificarCulebrasyEscaleras(nuevaCasilla,jugador);
            }

        }
        else
        {
            nuevaCasilla=verificarNuevaCasilla(maquina.getNumCasilla()+avance);
            if(jugador.getNumCasilla()==nuevaCasilla)
            {
                jugador.setLlegoPrimero(true);
                jugGanoMiniJuego=jugGanoMiniJuego=disputarCasilla(jugador.getId());
                

            }else
            {
                    maquina.setLlegoPrimero(true);
                    verificarCulebrasyEscaleras(nuevaCasilla,maquina);
            }
           
        }



    }




    public int verificarNuevaCasilla(int nuevaCasilla)
    {
            int valorCasilla=63;


            if(nuevaCasilla>63)
            {
                int diferencia=(nuevaCasilla-63);
                valorCasilla-=diferencia;

            }
            else if(nuevaCasilla<0)
            {
                valorCasilla=0;
            }
            else
            {valorCasilla=nuevaCasilla;}

           return valorCasilla;
    }

    public void asignarCasillaJugGanoMini(int jugGanador,int casilla)
    {
        switch(jugGanador)
        {
            case 0:  {
                            jugador.setLlegoPrimero(false);
                            maquina.setLlegoPrimero(false);
                            casilla=verificarNuevaCasilla(casilla-penalEmpMini);

                            verificarCulebrasyEscaleras(casilla,jugador);
                            verificarCulebrasyEscaleras(casilla,maquina);
                    };
            case 1: {
                            jugador.setLlegoPrimero(true);
                            maquina.setLlegoPrimero(true);
                            jugador.setNumCasilla(casilla);
                            casilla=verificarNuevaCasilla(casilla-penalPerderMini);
                           verificarCulebrasyEscaleras(casilla,maquina);
                    };
            case 2: {
                        jugador.setLlegoPrimero(true);
                         maquina.setLlegoPrimero(true);
                        maquina.setNumCasilla(casilla);
                        casilla=verificarNuevaCasilla(casilla-penalPerderMini);
                         verificarCulebrasyEscaleras(casilla,jugador);
                    };
        }
        asignoCasilla=true;
    }

    public int dado()
    {
        int numero=(int)((Math.random()*6)+1);
        
        ultimoLanzamiento=numero;
        System.out.println("dado: "+ultimoLanzamiento);
        return numero;
    }
GUITerritorio territorio;
 GUIPizzaEnvenenada objPizza;
        GUIPrecipicio objPrecipicio;
         int jugadorGanador;
         JugadorSAL jugadorTmp;

    public int disputarCasilla(int jugadorInicia)
    {
        boolean jugadorIni=false;
        asignoCasilla=false;


        if(jugadorInicia==1)
        {
            jugadorIni=false;
            jugadorTmp=jugador;
        }
        else {jugadorIni=true;
            jugadorTmp=maquina;
        }
        jugadorGanador=-1;
        
       

         int minijuego=(int)((Math.random()*3))+1;
         System.out.println("minijuego "+minijuego);

         switch(minijuego)
         {
             case 3:{
                        System.out.println("precipicio");
                        objPrecipicio= new GUIPrecipicio(jugadorIni);
                        new JDialog(objPrecipicio);
                        Thread hilo=new Thread() {
                public  void run()
                        {
                    while(objPrecipicio.getResultado()==-1)
                    {
                              System.out.println(" ");
                    }
                    
                    jugadorGanador=objPrecipicio.getResultado();
                    asignarCasillaJugGanoMini(jugadorGanador, jugadorTmp.getNumCasilla());
                    System.out.println("ha ganado "+objPrecipicio.getResultado());
                    stop();
                }
            };
            hilo.start();
                        break;

                    }
             case 2: {
                        System.out.println("pizza");
                        objPizza=new GUIPizzaEnvenenada(jugadorIni);
                        new JDialog(objPizza);
                        Thread hilo=new Thread() {
                public  void run()
                        {
                    while(objPizza.getRespuesta()==-1)
                    {
                         System.out.println("");
                    }
                    
                    jugadorGanador=objPizza.getRespuesta();
                     asignarCasillaJugGanoMini(jugadorGanador, jugadorTmp.getNumCasilla());
                    System.out.println("ha ganado "+objPizza.getRespuesta());
                    stop();
                }
            };
            hilo.start();
                        break;
                      }
             case 1: {
                        System.out.println("territorio");
                        territorio=new GUITerritorio(jugadorInicia);
                        new JDialog(territorio);
             Thread hilo=new Thread() {
                public  void run()
                        {
                    while(territorio.getJugadorGanador()==-1)
                    {                       
                         System.out.println("no ha ganado ");
                    }
                    jugadorGanador=territorio.getJugadorGanador();
                     asignarCasillaJugGanoMini(jugadorGanador, jugadorTmp.getNumCasilla());
                    System.out.println("ha ganado "+territorio.getJugadorGanador());
                        stop();
                }
            };
            hilo.start();
                            
                        
                        break;
                     }
         }

         return jugadorGanador;
    }

   public int casillaActualJug()
   {
        return jugador.getNumCasilla();
   }

    public int casillaActualMaq()
   {
        return maquina.getNumCasilla();
   }
}
